package git.soulbgm.common.base;

import git.soulbgm.common.pojo.IdDto;
import git.soulbgm.common.pojo.PageInfo;
import git.soulbgm.common.pojo.ResultData;
import git.soulbgm.common.pojo.ReturnCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

/**
 * @author SoulBGM
 * @version 1.0
 * @date 2019/11/25 10:36
 */
public abstract class BaseController<S extends BaseService<T>, T> {

    /*
        常见的媒体格式类型如下：
        text/html ： HTML格式
        text/plain ：纯文本格式
        text/xml ： XML格式
        image/gif ：gif图片格式
        image/jpeg ：jpg图片格式
        image/png：png图片格式

        以application开头的媒体格式类型：
        application/xhtml+xml ：XHTML格式
        application/xml： XML数据格式
        application/atom+xml ：Atom XML聚合格式
        application/json： JSON数据格式
        application/pdf：pdf格式
        application/msword ： Word文档格式
        application/octet-stream ： 二进制流数据（如常见的文件下载）
        application/x-www-form-urlencoded ： <form encType=””>中默认的encType，form表单数据被编码为key/value格式发送到服务器（表单默认的提交数据的格式）

        另外一种常见的媒体格式是上传文件之时使用的：
        multipart/form-data ： 需要在表单中进行文件上传时，就需要使用该格式
     */

    @Autowired
    protected S service;

    /**
     * 保存数据
     *
     * @param t 泛型对象
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"add"}, method = RequestMethod.POST, produces = "application/json")
    public ResultData save(@RequestBody T t) {
        boolean flag = service.save(t);
        if (flag) {
            return ResultData.getResultData(ReturnCode.SUCCESS);
        } else {
            return ResultData.getResultData(ReturnCode.SAVE_FAIL);
        }
    }

    /**
     * 保存多个数据
     *
     * @param list 泛型集合对象
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"addList"}, method = RequestMethod.POST)
    public ResultData addList(@RequestBody List<T> list) {
        boolean flag = service.saveBatch(list);
        if (flag) {
            return ResultData.getResultData(ReturnCode.SUCCESS);
        } else {
            return ResultData.getResultData(ReturnCode.SAVE_FAIL);
        }
    }

    /**
     * 删除数据
     *
     * @param idDto 对象的id主键
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"removeById"}, method = RequestMethod.DELETE)
    public ResultData removeById(@RequestBody IdDto idDto) {
        boolean flag = service.removeById(idDto.getId());
        if (flag) {
            return ResultData.getResultData(ReturnCode.SUCCESS);
        } else {
            return ResultData.getResultData(ReturnCode.REMOVE_FAIL);
        }
    }

    /**
     * 删除多个数据
     *
     * @param idDto 多个id主键
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"removeByIds"}, method = RequestMethod.DELETE)
    public ResultData removeByIds(@RequestBody IdDto idDto) {
        boolean flag = service.removeByIds(idDto.getIds());
        if (flag) {
            return ResultData.getResultData(ReturnCode.SUCCESS);
        } else {
            return ResultData.getResultData(ReturnCode.REMOVE_FAIL);
        }
    }

    /**
     * 修改数据
     *
     * @param t 需要修改的对象
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"update"}, method = RequestMethod.PUT)
    public ResultData update(@RequestBody T t) {
        boolean flag = service.update(t);
        if (flag) {
            return ResultData.getResultData(ReturnCode.SUCCESS);
        } else {
            return ResultData.getResultData(ReturnCode.UPDATE_FAIL);
        }
    }

    /**
     * 按主键查找数据
     *
     * @param idDto 对象的id主键
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"findById"}, method = RequestMethod.GET)
    public ResultData findById(IdDto idDto) {
        T t = service.findById(idDto.getId());
        if (t != null) {
            return ResultData.getResultData(ReturnCode.SUCCESS, t);
        } else {
            return ResultData.getResultData(ReturnCode.INVALID_FAIL);
        }
    }

    /**
     * 按多个主键查找数据
     *
     * @param idDto 多个id主键
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"findByIds"}, method = RequestMethod.GET)
    public ResultData findByIds(IdDto idDto) {
        List<T> list = service.findByIds(idDto.getIds());
        if (list != null) {
            return ResultData.getResultData(ReturnCode.SUCCESS, list);
        } else {
            return ResultData.getResultData(ReturnCode.FIND_FAIL);
        }
    }

    /**
     * 查询全部数据
     *
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"findAll"}, method = RequestMethod.GET)
    public ResultData findAll() {
        List<T> list = service.findAll();
        if (list != null) {
            return ResultData.getResultData(ReturnCode.SUCCESS, list);
        } else {
            return ResultData.getResultData(ReturnCode.FIND_FAIL);
        }
    }

    /**
     * 按泛型对象查询数据
     *
     * @param t 泛型对象
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"findByModel"}, method = RequestMethod.GET)
    public ResultData findByModel(T t) {
        List<T> list = service.findByModel(t);
        if (list != null) {
            return ResultData.getResultData(ReturnCode.SUCCESS, list);
        } else {
            return ResultData.getResultData(ReturnCode.FIND_FAIL);
        }
    }

    /**
     * 按泛型对象查询数据
     *
     * @param pageNum  页码
     * @param pageSize 每页显示数量
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"findByPage"}, method = RequestMethod.GET)
    public ResultData findByPage(int pageNum, int pageSize, T t) {
        PageInfo pageInfo = service.findByPage(pageNum, pageSize, t);
        if (pageInfo != null) {
            return ResultData.getResultData(ReturnCode.SUCCESS, pageInfo);
        } else {
            return ResultData.getResultData(ReturnCode.FIND_FAIL);
        }
    }

    /**
     * 按泛型对象查询数据
     *
     * @param t 泛型对象
     * @return 统一的前段返回实体
     */
    @RequestMapping(value = {"findCount"}, method = RequestMethod.GET)
    public ResultData findCount(T t) {
        int count = service.findCount(t);
        return ResultData.getResultData(ReturnCode.SUCCESS, count);
    }


}
